#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
using namespace std;

void handler(int sig)
{
    cout << "err:程序试图访问野指针" << endl;
    cout << "get a signal, number is " << sig << endl;
    exit(0);
}
int main()
{
    signal(SIGSEGV, handler);
    int* p = nullptr;
    *p = 100;
    sleep(10);
    return 0;
}
// void handler(int sig)
// {
//     cout << "发生除零错误" << endl;
//     cout << "get a signal, number is " << sig << endl;
//     //程序不退出的话，OS会一直捕捉到SIGFPE信号，一直打印
//     exit(0);
// }
// int fun()
// {
//     int a = 10;
//     return a / 0;   //除零异常 - 发送信号SIGFPE
// }
// int main()
// {
//     signal(SIGFPE, handler);    //自定义递达SIGFPE信号方法
//     fun();
//     sleep(2);
//     return 0;
// }
// int g_cnt = 0;
// void handler(int sig)
// {
//     cout << "g_cnt: " << g_cnt  << endl;
//     cout << "闹钟响了" << g_cnt / 5 << "次" << endl;
//     int n = alarm(5);
//     cout << "闹钟剩余时间: " << n << endl;
//     if (g_cnt == 20)
//     {
//         cout << "闹钟响了4次，进程退出..." << endl;
//         exit(0);
//     }
// }
// int main()
// {
//     signal(SIGALRM, handler);
//     alarm(5);//5s响一次 对当前进程发送14号信号SIGALRM
//     while (true)
//     {
//         if (g_cnt == 8)
//         {
//             cout << "Alarm close..." << endl;
//             alarm(0);   //关闭闹钟后， OS不会对进程发送SIGALRM信号，之前设置的闹钟全部失效
//         }
//         cout << "I am activing..." << endl;
//         g_cnt++;
//         sleep(1);
//     }
//     return 0;
// }
// int main()
// {
//     int cnt = 0;
//     while (true)
//     {
//         if (cnt == 10)
//         {
//             cout << "abort()" << endl;
//             //对当前进程发送6号信号(SIGABRT)
//             abort();
//         }
//         sleep(1);
//         cnt++;

//     }
// }
//收到2号信号不退出，只打印消息
//OS会将ctrl + c解释为 2号信号 
// void handler(int sig)
// {
//     cout << "get a signal, number is " << sig << endl;
// }
// int main()
// {
//     //信号的捕捉 -signal
//     signal(2, handler);
//     int cnt = 0;
//     while (true)
//     {
//         cout << "I am activing, pid: " << getpid() << endl;
//         cnt++;
//         if ((cnt % 5) == 0)
//         {
//             cout << "send 2 to process" << endl;
//             raise(2);   //向当前进程发送指定信号
//         }   
//         sleep(1);
//     }
//     return 0;
// }